import fs from "fs";
import path from "path";

// 读64 -》 写64k  -》 暂停读取  -》 写完64k后通知我 -》 恢复读取 -》 循环

// function copy(source, target) {
//   const rs = fs.createReadStream(source, {
//     highWaterMark: 4, // 每次读取10个, 这个默认值是64k  64 * 1024
//   });

//   const ws = fs.createWriteStream(target, {
//     highWaterMark: 1, // 默认值是16k  16 * 1024
//   });

//   rs.on("data", function (chunk) {
//     const flag = ws.write(chunk); // 异步可以有返回值
//     if (!flag) {
//       // 超过预期了 暂停读取
//       rs.pause();
//     }
//   });

//   rs.on("end", function () {
//     ws.end(""); // 表示关闭写入
//   });

//   ws.on("drain", function () {
//     // 当写入的内容超过预期，并且都消耗掉后，会触发回调
//     rs.resume();
//   });
// }

function copy(source, target) {
  const rs = fs.createReadStream(source, {
    highWaterMark: 4, // 每次读取10个, 这个默认值是64k  64 * 1024
  });
  const ws = fs.createWriteStream(target, {
    highWaterMark: 1, // 默认值是16k  16 * 1024
  });
  rs.pipe(ws); // 真正实现文件拷贝的时候只需要采用pipe即可
}

copy(
  path.resolve(import.meta.dirname, "pc.js"),
  path.resolve(import.meta.dirname, "pc-copy.js")
);

// 单独读取流 还是采用 on('data') on('end')
// 单独的写入流  还是采用 write()   end()
// 拷贝可以直接采用pipe()

// 读取的时候可能会出现乱码

const rs = fs.createReadStream(path.resolve(import.meta.dirname, "test.txt"), {
  highWaterMark: 4, // 每次读取10个, 这个默认值是64k  64 * 1024
});

// 客户端给服务端传递数据   包 -》 tcp  -》 帧（1帧 1460个字节）   传递一个1m的内容 ，一点点接受 （将内容整合在一起）
let arr = [];
rs.on("data", function (data) {
  arr.push(data);
});
rs.on("end", function () {
  console.log(Buffer.concat(arr).toString()); // 对二进制来进行拼接操作
});
